﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.Mvc;
using MSDAL;
using MSWeb.Models;
using PagedList;

namespace MSWeb.Controllers
{
    public class LekcjesController : Controller
    {
        private MSEntities db;
        private EventProcessor eventEngine;

        public IEnumerable<SelectListItem> GetNauczyciele()
        {
            IList<SelectListItem> items = new List<SelectListItem>();
            db.Nauczyciele.ToList().ForEach(item =>
            {
                items.Add(new SelectListItem
                {
                    Value = item.IDNauczyciela.ToString(),
                    Text = item.Imie + " " + item.Nazwisko
                });
            });
            return items;
        }

        public IEnumerable<SelectListItem> GetUczniowie()
        {
            IList<SelectListItem> items = new List<SelectListItem>();
            db.Uczniowie.ToList().ForEach(item =>
            {
                items.Add(new SelectListItem
                {
                    Value = item.IDUcznia.ToString(),
                    Text = item.Imie + " " + item.Nazwisko
                });
            });
            return items;
        }

        public LekcjesController()
        {
            db = new MSEntities();
            eventEngine = new EventProcessor();
        }

        public void AktualizyjLekcje(int id, string NewEventStart, string NewEventEnd)
        {
            eventEngine.AkgualizujLekcje(id, NewEventStart, NewEventEnd);
        }

        public JsonResult GetEvents(double start, double end)
        {
            var eventList = eventEngine.GetLessonList(start, end);
            ViewBag.IleLekcji = eventList.Count.ToString();
            var rows = eventList.ToArray();
            return Json(rows, JsonRequestBehavior.AllowGet);
        }

        public ActionResult WidokDzienny()
        {            
            return View();
        }

        private List<Events> GetEvents(DateTime from, DateTime to)
        {
            List<Lekcje> lekcje = new List<Lekcje>();
            List<Lekcje> res = db.Lekcje
                    .Include(l => l.Instrumenty)
                    .Include(l => l.Nauczyciele)
                    .Include(l => l.Sale)
                    .Include(l => l.Uczniowie)
                    .Where(i => i.Data.Value.Year == from.Date.Year
                    && i.Data.Value.Month == from.Date.Month
                    && i.Data.Value.Day == from.Date.Day)
                    .ToList();
            List<Events> eventList = new List<Events>();
            res.ForEach(lekcja =>
            {
                DateTime dataPlus = lekcja.Data.Value.AddHours(1);
                eventList.Add(new Events
                {
                    id = lekcja.IDLekcji.ToString(),
                    start = lekcja.Data.Value.ToString("s"),
                    end = dataPlus.ToString("s"),
                    allDay = false,
                    title = lekcja.Instrumenty.NazwaInstrumentu + " " +
                        lekcja.Uczniowie.Imie + " " + lekcja.Uczniowie.Nazwisko
                });
            });
            return eventList;
        }

        // GET: Lekcjes
        [Authorize]
        public ActionResult Index(int? page)
        {
            int pageSize = 10;
            int pageNumber = (page ?? 1);
            var lekcje = db.Lekcje.Include(l => l.Instrumenty)
               .Include(l => l.Nauczyciele)
               .Include(l => l.Sale)
               .Include(l => l.Uczniowie);
            ViewBag.IDInstrumentu = new SelectList(db.Instrumenty, "IDInstrumentu", "NazwaInstrumentu");
            ViewBag.IDNauczyciela = new SelectList(db.Nauczyciele, "IDNauczyciela", "Imie");
            ViewBag.IDSali = new SelectList(db.Sale, "IDSali", "NazwaSali");
            ViewBag.IDUcznia = new SelectList(db.Uczniowie, "IDUcznia", "Imie");
            return View(lekcje.OrderBy(i => i.IDLekcji)
                .ToPagedList(pageNumber, pageSize));
        }

        [Authorize]
        public ActionResult Tworzenie()
        {
            ViewBag.IDInstrumentu = new SelectList(db.Instrumenty, "IDInstrumentu", "NazwaInstrumentu");
            ViewBag.IDNauczyciela = GetNauczyciele();
            ViewBag.IDSali = new SelectList(db.Sale, "IDSali", "NazwaSali");
            ViewBag.IDUcznia = GetUczniowie();
            return PartialView("_TworzenieLekcji");
        }

        [Authorize]
        public ActionResult Edycja(int? id)
        {
            if (!id.HasValue)
            {
                TempData["Error"] = "Nieodnaleziono podanego rekordu";
                return RedirectToAction("Index");
            }
            else
            {
                if (db.Lekcje.Any(i => i.IDLekcji == id))
                {
                    ViewBag.IDInstrumentu = new SelectList(db.Instrumenty, "IDInstrumentu", "NazwaInstrumentu");
                    ViewBag.IDNauczyciela = GetNauczyciele();
                    ViewBag.IDSali = new SelectList(db.Sale, "IDSali", "NazwaSali");
                    ViewBag.IDUcznia = GetUczniowie();
                    Lekcje salaDoPrzetworzenia = db.Lekcje.First(i => i.IDLekcji == id);
                    return PartialView("_EdycjaLekcji", salaDoPrzetworzenia);
                }
                else
                {
                    TempData["Error"] = "Nieodnaleziono podanego rekordu";
                    return RedirectToAction("Index");
                }
            }
        }

        [Authorize]
        public ActionResult EdycjaLekcji()
        {
            return View();
        }

        [HttpPost]
        [Authorize]
        [ValidateAntiForgeryToken]
        public ActionResult EdycjaLekcji(EdycjaLekcjiInitVM initVm)
        {
            return RedirectToAction("IndexZData", initVm.DataLekcji);
        }

        [Authorize]
        public ActionResult IndexZData(DateTime? Date)
        {
            if (Date.HasValue)
            {
                DateTime dataOnly = Date.Value.Date;
                var res = db.Lekcje
                    .Include(l => l.Instrumenty)
                    .Include(l => l.Nauczyciele)
                    .Include(l => l.Sale)
                    .Include(l => l.Uczniowie)
                    .Where(i => i.Data.Value.Year == dataOnly.Date.Year
                    && i.Data.Value.Month == dataOnly.Date.Month
                    && i.Data.Value.Day == dataOnly.Date.Day)
                    .ToList();
                if (res.Count > 0)
                {
                    return View(res);
                }
                else
                {
                    TempData["Error "] = "Brak lekcji w tej selekcji";
                    return RedirectToAction("EdycjaLekcji");
                }
            }
            else
            {
                TempData["Error "] = "Brak lekcji w tej selekcji";
                return RedirectToAction("EdycjaLekcji");
            }
        }

        [Authorize]
        public ActionResult Detale(int id)
        {
            Lekcje lekcje = db.Lekcje.Find(id);
            if (lekcje == null)
            {
                return HttpNotFound();
            }
            var vm = db.Lekcje.First(i => i.IDLekcji == id);
            return PartialView("_LekcjeDetalePartial", vm);
        }

        // GET: Lekcjes/Details/5
        [Authorize]
        public ActionResult Details(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Lekcje lekcje = db.Lekcje.Find(id);
            if (lekcje == null)
            {
                return HttpNotFound();
            }
            return View(lekcje);
        }

        [Authorize]
        public ActionResult Create()
        {
              return View();
        }

        [HttpPost]
        [Authorize]
        [ValidateAntiForgeryToken]
        public ActionResult Create(NewLessonViewModel lekcje)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    Lekcje lekcjaDoDodania = new Lekcje
                    {
                        IDUcznia = lekcje.IDUcznia,
                        IDNauczyciela = lekcje.IDNauczyciela,
                        Instrumenty = lekcje.Instrumenty,
                        Data = lekcje.Data,
                        Sale = lekcje.Sale,
                        IDSali = lekcje.IDSali,
                        CzyRozliczona = lekcje.CzyRozliczona,
                        CzyZatwierdzona = lekcje.CzyZatwierdzona,
                        CzyWyplacona = lekcje.CzyWyplacona,
                        CenaLekcjiUcznia = lekcje.CenaLekcjiUcznia,
                        CenaLekcjiNauczyciela = lekcje.CenaLekcjiNauczyciela,
                        Komentarz = lekcje.Komentarz,
                        TypLekcji = lekcje.TypLekcji,
                        CzyUczenL4 = lekcje.CzyUczenL4,
                        IDInstrumentu = lekcje.IDInstrumentu,
                        CzasTrwaniaLekcji = lekcje.CzasTrwaniaLekcji
                    };
                    db.Lekcje.Add(lekcjaDoDodania);
                    db.SaveChanges();
                    for (int i = 1; i <= lekcje.IleCykli; i++)
                    {
                        lekcjaDoDodania = new Lekcje
                        {
                            IDUcznia = lekcje.IDUcznia,
                            IDNauczyciela = lekcje.IDNauczyciela,
                            Instrumenty = lekcje.Instrumenty,
                            Sale = lekcje.Sale,
                            IDSali = lekcje.IDSali,
                            CzyRozliczona = lekcje.CzyRozliczona,
                            CzyZatwierdzona = lekcje.CzyZatwierdzona,
                            CzyWyplacona = lekcje.CzyWyplacona,
                            CenaLekcjiUcznia = lekcje.CenaLekcjiUcznia,
                            CenaLekcjiNauczyciela = lekcje.CenaLekcjiNauczyciela,
                            Komentarz = lekcje.Komentarz,
                            TypLekcji = lekcje.TypLekcji,
                            CzyUczenL4 = lekcje.CzyUczenL4,
                            IDInstrumentu = lekcje.IDInstrumentu,
                            CzasTrwaniaLekcji = lekcje.CzasTrwaniaLekcji
                        };
                        if (lekcje.TypCyklu == TypyRozliczen.CoMiesiac)
                        {
                            lekcjaDoDodania.Data = lekcje.Data.Value.AddMonths(i);
                        }
                        else
                        {
                            lekcjaDoDodania.Data = lekcje.Data.Value.AddDays(i * 7);
                        }
                        db.Lekcje.Add(lekcjaDoDodania);
                        db.SaveChanges();
                    }
                    return RedirectToAction("WidokDzienny");
                }
                else
                {
                    TempData["Error "] = "Wystapił błąd podczas dodawania wpisu.";
                    return RedirectToAction("WidokDzienny");
                }                
            }
            catch
            {
                TempData["Error "] = "Wystapił błąd podczas dodawania wpisu.";
                return RedirectToAction("WidokDzienny");
            }
        }


        // GET: Lekcjes/Edit/5
        [Authorize]
        public ActionResult Edit(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Lekcje lekcje = db.Lekcje.Find(id);
            if (lekcje == null)
            {
                return HttpNotFound();
            }
            ViewBag.IDInstrumentu = new SelectList(db.Instrumenty, "IDInstrumentu", "NazwaInstrumentu", lekcje.IDInstrumentu);
            ViewBag.IDNauczyciela = new SelectList(db.Nauczyciele, "IDNauczyciela", "Imie", lekcje.IDNauczyciela);
            ViewBag.IDSali = new SelectList(db.Sale, "IDSali", "NazwaSali", lekcje.IDSali);
            ViewBag.IDUcznia = new SelectList(db.Uczniowie, "IDUcznia", "Imie", lekcje.IDUcznia);
            return View(lekcje);
        }

        // POST: Lekcjes/Edit/5
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [Authorize]
        [ValidateAntiForgeryToken]
        public ActionResult Edit(Lekcje lekcje)
        {
            if (ModelState.IsValid)
            {
                db.Entry(lekcje).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("WidokDzienny");
            }
            return RedirectToAction("WidokDzienny");
        }

        // GET: Lekcjes/Delete/5
        [Authorize]
        public ActionResult Delete(int? id)
        {
            if (id == null)
            {
                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            }
            Lekcje lekcje = db.Lekcje.Find(id);
            if (lekcje == null)
            {
                return HttpNotFound();
            }
            return View(lekcje);
        }

        // POST: Lekcjes/Delete/5
        [HttpPost, ActionName("Delete")]
        [ValidateAntiForgeryToken]
        [Authorize]
        public ActionResult DeleteConfirmed(int id)
        {
            Lekcje lekcje = db.Lekcje.Find(id);
            db.Lekcje.Remove(lekcje);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }
}
